Fixes after addition of dummy_vcpu_info.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 2 Nov 2009 09:38:34 +0000 (09:38 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 2 Nov 2009 09:38:34 +0000 (09:38 +0000)
 - Clean initialisation of new vcpu_info in map_vcpu_info() if the
 vcpu was previously using the shared dummy structure.
 - Don't allow a vcpu to run with teh shared dummy info structure, as
 no good can come of it.

Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/domain.c
xen/common/domain.c

index 7c22d131b83a207b550cca6e6710dd4c396fb0ab..8f600d292576fe2d6d00704d4d959ae3f1975a8c 100644 (file)
@@ -884,7 +884,15 @@ map_vcpu_info(struct vcpu *v, unsigned long mfn, unsigned offset)
 
     new_info = (vcpu_info_t *)(mapping + offset);
 
-    memcpy(new_info, v->vcpu_info, sizeof(*new_info));
+    if ( v->vcpu_info == &dummy_vcpu_info )
+    {
+        memset(new_info, 0, sizeof(*new_info));
+        __vcpu_info(v, new_info, evtchn_upcall_mask) = 1;
+    }
+    else
+    {
+        memcpy(new_info, v->vcpu_info, sizeof(*new_info));
+    }
 
     v->vcpu_info = new_info;
     v->arch.vcpu_info_mfn = mfn;
index 468f3476ae15e15261f7ccb278f4b4f9db6edad0..5c64fb01a3383cd24ebd53a72f38a5e1c6ef9327 100644 (file)
@@ -757,6 +757,9 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg)
     switch ( cmd )
     {
     case VCPUOP_initialise:
+        if ( v->vcpu_info == &dummy_vcpu_info )
+            return -EINVAL;
+
         if ( (ctxt = xmalloc(struct vcpu_guest_context)) == NULL )
             return -ENOMEM;